// 权限控制
import router from '@/router'
import store from '@/store'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import { asyncRoutes } from '@/router/asyncRoutes'
// 白名单
const whiteList = [
  '/login',
  '/404'
]
// 登录权限
router.beforeEach(async(to, from, next) => {
  NProgress.start()

  const token = store.state.user.token
  console.log(token)
  if (token) {
    // token 存在，已经登录
    if (to.path === '/login') {
      // 去的是登录页，强制跳转到后台主页
      next('/')
      NProgress.done()
    } else {
      if (!store.state.user.userinfo.userId) {
        //   在前置守卫有token的地方调用vuex的方法
        // 拿到菜单权限数据
        const roles = await store.dispatch('user/fetchUserInfo')
        console.log(roles.menus, '权限路由')
        // 对所有动态路由表做过滤处理
        const filterRoutes = asyncRoutes.filter(item => {
          // 根据路由的 name 属性，能在 menus 权限数据中找到，代表可以访问
          return roles.menus.includes(item.children[0].name)
        })
        router.addRoutes([...filterRoutes, { path: '*', redirect: '/404', hidden: true }])
        store.commit('menu/setMenuList', filterRoutes)
        console.log(filterRoutes, '过滤后的路由')
        // 动态新增路由，是异步的，不会立刻生效，为了保证生效，需要让用户在动态添加路由后重新进一下，他刚才进的这个页面
        // 你怎么来的，就怎么重新进一次（固定配合语法）
        next({
          ...to,
          replace: true// 不保留本次进入页面的路由记录
        })
        return
      }
    }
    // 去的不是登录页，直接放行
    next()
  } else {
    // token 不存在，还没登录
    if (whiteList.includes(to.path)) {
      // 要去的是白名单页面，直接放行
      next()
    } else {
      // 要去的需要登录才能访问的页面，强制跳转到登录页登录
      next('/login')
      NProgress.done()
    }
  }
})
router.afterEach((to, next) => {
  NProgress.done()
})
